package com.wang.myreflect;

import java.lang.reflect.Field;

/**
 * 获取成员变量
 * @author yandong
 */
public class MyReflectDemo3 {
    public static void main(String[] args) throws Exception {
        /*
         * Class类中用于获取成员变量的方法:
         * 1. Field[] getFields(): 返回所有公共成员变量对象的数组
         * 2. Field[] getDeclaredFields(): 返回所有成员变量对象的数组
         * 3. Field getField(String name): 返回单个公共成员变量对象
         * 4. Field getDeclaredField(String name): 返回单个成员变量对象
         *
         * Field类中用于操作成员变量的方法:
         * 5. void set(Object obj, Object value): 赋值
         * 6. Object get(Object obj): 获取值
         */

        // 1.获取 Student的字节码文件class对象
        Class clazz = Class.forName("com.wang.myreflect.Student");

        // 2.获取所有public成员变量
        Field[] fields1 = clazz.getFields();
        for (Field field : fields1) {
            System.out.println(field);
        }
        System.out.println("===========================");

        // 3.获取所有成员变量
        Field[] fields2 = clazz.getDeclaredFields();
        for (Field field : fields2) {
            System.out.println(field);
        }

        System.out.println();
        System.out.println("=========================== ===========================");
        System.out.println();


        // 4.获取单个public成员变量
        Field field1 = clazz.getField("gender");
        System.out.println(field1);
        System.out.println("===========================");

        // 5.获取单个成员变量
        Field field2 = clazz.getDeclaredField("age");
        System.out.println(field2);
        Field field3 = clazz.getDeclaredField("name");
        System.out.println(field3);

        System.out.println();
        System.out.println("=========================== ===========================");
        System.out.println();

        // 获取成员变量的权限修饰符
        int modifiers = field3.getModifiers();
        System.out.println(modifiers);

        // 获取成员变量的字段名
        String n = field3.getName();
        System.out.println(n);

        // 获取成员变量的数据类型
        Class type = field3.getType();
        System.out.println(type);

        // set 和 get 方法
        Student stu = new Student("Tom", 12);
        field3.setAccessible(true); // 临时取消权限校验 (暴力反射)
        System.out.println(field3.get(stu));
        field3.set(stu, "Jerry");
        System.out.println(field3.get(stu));
    }
}
